package com.timeriver.data_preprocess

import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.ml.stat.ChiSquareTest
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

/**
  * 假设检验：查看数据是否具备统计学意义，即两类变量间是否存在关联性和依存性关系，使用输出的pValue判断因素之间是否独立
  *     数据源：mysql
  *     计算算子：皮尔森卡方检验 ChiSquareTest
  *     计算结果：
  *         pValues：越接近0，表示二者越存在相关性，则拒绝原假设（假设二者不存在相关性）
  *         degreesOfFreedom：自由度，表征变量间是否存在独立性的个数
  *         statistics：统计量，皮尔森卡方检验计算的结果值，无特殊含义
  */
object TestingDemo {
  def main(args: Array[String]): Unit = {
    val session: SparkSession = SparkSession.builder()
      .appName("皮尔逊独立检验计算")
      .master("local[6]")
      .getOrCreate()

    val df: DataFrame = session.read
      .format("jdbc")
      .option("url", "jdbc:mysql://10.0.24.197:3306/ml_datasets")
      .option("driver", "com.mysql.jdbc.Driver")
      .option("dbtable", "breast_cancer_wisconsin")
      .option("user", "root")
      .option("password", "123456")
      .load()

    /** 过滤缺失值 */
    val value: Dataset[Row] = df.filter(!_.anyNull)

    /** 获取特征列字段数组 */
    val inputCols: Array[String] = "clump_thickness,uniformity_of_cell_size,uniformity_of_cell_shape,marginal_adhesion,single_epithelial_cell_size,bare_nuclei,blan_chromatin,normal_nucleoli,mitoses".split(",")

    /** 构建特征列向量 */
    val data: DataFrame = new VectorAssembler()
      .setInputCols(inputCols)
      .setOutputCol("features")
      .transform(value)

    val frame: DataFrame = data.select("features", "class")

    val res: DataFrame = ChiSquareTest.test(frame, "features", "class")

    res.show(false)
  }
}
